import IPoint from "../interface/IPoint"
import MyControlPoint from "./MyControlPoint";
import Block from "./Block";

abstract class Node {

    abstract id: string  // 唯一id
    abstract name: string  //名称
    abstract class: string;  // 元素类型名称

    // 元素基本属性
    abstract zIndex: number;  // 层级关系

    // 元素控制点相关属性
    abstract controlPoints: MyControlPoint[];  // 控制点
    abstract parentBlock: Node | null; // 关联父元素
    abstract transformPoint: Block | null // 是否在形变，放大缩小旋转

    // 节点状态
    abstract isPointIn: boolean //鼠标是否悬浮在元素上
    abstract isFixedSize: boolean // 是否固定大小，不随网格缩放
    abstract isFixedPos: boolean;  // 是否绝对位置.不跟随网格移动
    abstract isGrouped: boolean // 是否拖拽中
    abstract isFocus: boolean  // 是否获取到焦点
    abstract isDraged: boolean;  // 是否在拖拽中

    // 节点功能
    abstract cbSelect: boolean;  // 是否可被选择
    abstract cbMove: boolean; // 是否可被移动
    abstract cbTransform: boolean; // 是否调整, 缩放旋转等
    abstract cbAdsorption: boolean;  // 是否开启吸附效果
    abstract mouseOn: Function | null;  // 如果有，鼠标悬浮后就会被调用
    abstract mouseDown: Function | null;  // 如果有，鼠标点击后就会被调用
    abstract mouseLeave: Function | null;  // 如果有，鼠标离开后就会被调用

    abstract toFixedPos(): void;
    abstract toFixedSize(): void;
    abstract toRelativePos(): void;
    abstract toRelativeSize(): void;

    abstract addBlock(block: Block): void; // 嵌套子元素
    abstract removeBlock(): void;
    abstract popBlock(): void; // 移除最后一个子元素
}

export default Node;